#include <stdio.h>
#include <stdlib.h> // 内有内存分配的函数
#define SIZE 6 // 对SIZE进行宏定义，表示顺序表申请空间的大小

typedef struct List
{
    int *head;
    int length;
    int size;
}list;

// 初始化线性表
list init(){
    list table;
    table.head = (int *)malloc(SIZE * sizeof(int));
    // 判断内存分配是否失败
    if(table.head == NULL){
        printf("初始化失败");
        exit(0);
    }
    table.length = 0;
    table.size = 6;
    return table;
}

// 输出线性表
void showList(list l){
    for(int i=0;i<l.length;i++){
        printf("%d ", l.head[i]);
    }
    printf("\n");
}

// 插入
list insert(list l, int ele, int loc){
    // 看插入的位置是否正确
    if(loc>l.length+1 || loc<1){
        printf("插入的位置有问题\n");
        return l;
    }
    // 看是否有多余的空间
    if(l.length == l.size){
        l.head = (int *)realloc(l.head, (l.size+1)*sizeof(int));
        if (l.head) {
            printf("存储分配失败\n");
            return l;
        }
        l.size+=1;
    }
    // 插入操作，将后面的元素后移一位
    for(int i=l.length-1;i>loc-1;i--){
        l.head[i+1] = l.head[i];
    }
    // 后移完成后，插入元素
    l.head[loc-1] = ele;
    return l;
}

// 删除
list delete(list l, int loc){
    // 看删除的位置是否正确
    if(loc>l.length || loc<1){
        printf("插入的位置有问题\n");
        return l;
    }
    
    // 删除操作，将后面的元素前移一位
    for(int i=loc;i<l.length;i++){
        l.head[i-1] = l.head[i];
    }
    l.length--;
    return l;
}

// 查找
int find(list l, int ele){
    for(int i=0;i<l.length;i++){
        if(l.head[i]==ele){
            return i+1;
        }
    }
    return -1; // 如果查找失败，返回-1
}

// 更新
list update(list l, int old, int new){
    int loc = find(l, old);
    l.head[loc-1] = new;
    return l;
}

// 线性表的顺序存储结构
// 相比链式存储结构的优势：查找、更新，因为其实随机存取结构
int main(){
    list l = init();
    // 向顺序表中添加元素
    for(int i=0;i<SIZE;i++){
        l.head[i] = i;
        l.length ++;
    }
    printf("顺序表中存储的元素分别是：\n");
    // printf("%d", l.length);
    showList(l);
    return 0;
}